Skip to content

doc(proposal): un/break --test#13

Open
JakobJingleheimer wants to merge 3 commits intomainfrom
proposals/unbreak-test-flag
Open

doc(proposal): un/break --test#13
JakobJingleheimer wants to merge 3 commits intomainfrom
proposals/unbreak-test-flag

Conversation

@JakobJingleheimer
Copy link
Member

A follow-up to the discussion in the 26 Jan 2026 team meeting

node
--test ./src/foo/*.test.js
--test ./src/bar/*.test.js
./src/not-pjson-main.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What would the purpose of this be? The test runner runs for the two glob patterns and then does what with this entry point script? Executes it as a test too or just as a regular node script?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, yes, true. Let's say there is no such thing as an entry-point for test mode (I think that doesn't exist currently either). If there's any "entry-point" when --test is present, throw.

I think in order to run an arbitrary script, it should be done with --import (and friends); otherwise, you get into inception.

node
  --import ./test/env.setup.js
  --import ./test/fix-snapshot-naming.js
  --test ./src/foo/*.test.js
  --test ./src/bar/*.test.js

./src/not-pjson-main.js
```

An explicit entrypoint, like all node commands, must come last and must be a relative or absolute path (not a glob/pattern).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this tracks for test. Many users will only want to pass a single glob pattern; at least I know that I do! What would the explicit entry point do for a test script?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, okay, fair. So when watch mode is combined with test mode, shall we say that entry-point is not applicable—it's only applicable for watch mode separately?

@cjihrig
Copy link

cjihrig commented Feb 9, 2026

How will this work across versions? Please don't underestimate the pain that inconsistencies in the test runner CLI across versions cause for users (ie glob support). It takes years for these pain points to go away.

@JakobJingleheimer
Copy link
Member Author

@cjihrig we discussed in today's meeting. I'm about to update this with the 3rd option that was born from that. I'll ping you for review in a few minutes.

@cjihrig
Copy link

cjihrig commented Feb 9, 2026

Discussed with @JakobJingleheimer and apparently it will not break existing users, so 👍

@JakobJingleheimer
Copy link
Member Author

I think "option 3" will actually JustWork? --test is eager/hungry, so

node
  --test ./foo.test.js
  --test ./bar.test.js

currently results in:

[
  './foo.test.js',
  '--test',
  './bar.test.js',
]

--test is nonsense for a value, and it currently gets discarded (all flags after --test do).

We can backport support for --watch-path (that’s nonbreaking); it would just continue to not work in older versions if supplied after --test.

Copy link
Contributor

@Ethan-Arrowood Ethan-Arrowood left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still seeing some parts of this talking about main entrypoints with the test runner which just doesn't make sense. I'd prefer we clean that up before merging this as that may only cause more confusion in further discussions.

Comment on lines 171 to 183
`test` would then work the same way:

```sh title='reads "main" etc from package.json'
node --test
```
```sh title='package.json "main" + an additional path'
node --test ./src/**/*.test.js
```
```sh title='explicit entrypoint + an additional path'
node
--test ./src/foo/*.test.js
--test ./src/bar/*.test.js
./src/not-pjson-main.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this section still needs to be updated, no? Test runs don't use main entrypoint or any entrypoint for that matter. It uses file patterns matching test files.

Comment on lines 198 to 199
--watch
./src/not-pjson-main.js
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't believe an newline character would change the CLI parsing here. This is the same as specifying a path for --watch. Or am I mistaken?

@JakobJingleheimer
Copy link
Member Author

I'm still seeing some parts of this talking about main entrypoints with the test runner which just doesn't make sense. I'd prefer we clean that up before merging this as that may only cause more confusion in further discussions.

Are you talking about the other options besides the one added yesterday? If so, my plan was to wait for people to weigh in; once one is selected, update the proposal to move the discard ones to a new "Rejected" section, and outdent the selected option.

If you're talking about the small bit mentioning --watch's value being discarded, doesn't that align with what you just said?

@Ethan-Arrowood
Copy link
Contributor

Maybe I'm not tracking; I am just confused by a script like:

node --watch ./src/not-pjson-main.js --test ./test/*.test.js

Like test mode should "overrule" the watch mode here. Unless the expectation is for that example to actually favor the watch entrypoint over test entries.

Take --watch out of the example for a moment. When you run node --test you don't invoke the package.json main script. Similarly, if you specified something like:

node main.js --test test.js

Only main.js is executed and the --test test.js is ignored.

So i want to be clear in our examples of what the behavior of combining --watch with --test is. IMO this is like a special case of "Test and Watch" that is distinct from just "Watch" or just "Test" modes.

I hope I'm making sense. Kinda difficult to explain I guess

@Ethan-Arrowood
Copy link
Contributor

Maybe my confusion / concern is that I'm conflating node --watch main.js to mean that not only is it watching main.js, but also executing it.

When you use --watch with --test, the paths specified are no longer being executed; instead it is just paths that need to be added to the watcher that would reinvoke the test process.

Thus we should be careful about language like "main entrypoint" because that implies its going to be executed (at least thats how I interpret it). I recognize that another interpretation is the main entrypoint is the default watch path.

Yeah this is a confusing one.

@ljharb
Copy link
Member

ljharb commented Feb 17, 2026

node --watch works. which implies that node --watch path/to/file is the same as node --path/to/file in watch mode.

In other words, node --watch ./src/not-pjson-main.js --test ./test/*.test.js should either be executing the file in watch mode, and then running the tests in watch mode - or, be an error - --watch should be treated as a boolean flag, not something that takes an argument.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

6 participants